static struct wl_seat *
find_grab_input_seat (GdkWindow *window, GdkWindow *transient_for)
{
+ GdkWindow *attached_grab_window;
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkWindowImplWayland *tmp_impl;
if (impl->grab_input_seat)
return impl->grab_input_seat;
+ /* HACK: GtkMenu grabs a special window known as the "grab transfer window"
+ * and then transfers the grab over to the correct window later. Look for
+ * this window when taking the grab to know it's correct.
+ *
+ * See: associate_menu_grab_transfer_window in gtkmenu.c
+ */
+ attached_grab_window = g_object_get_data (G_OBJECT (window), "gdk-attached-grab-window");
+ if (attached_grab_window)
+ {
+ tmp_impl = GDK_WINDOW_IMPL_WAYLAND (attached_grab_window->impl);
+ if (tmp_impl->grab_input_seat)
+ return tmp_impl->grab_input_seat;
+ }
+
while (transient_for)
{
tmp_impl = GDK_WINDOW_IMPL_WAYLAND (transient_for->impl);
return TRUE;
}
+static void
+associate_menu_grab_transfer_window (GtkMenu *menu)
+{
+ GtkMenuPrivate *priv = menu->priv;
+ GdkWindow *toplevel_window;
+ GdkWindow *transfer_window;
+
+ toplevel_window = gtk_widget_get_window (priv->toplevel);
+ transfer_window = g_object_get_data (G_OBJECT (menu), "gtk-menu-transfer-window");
+
+ if (toplevel_window == NULL || transfer_window == NULL)
+ return;
+
+ g_object_set_data (G_OBJECT (toplevel_window), I_("gdk-attached-grab-window"), transfer_window);
+}
+
/**
* gtk_menu_popup_for_device:
* @menu: a #GtkMenu
*/
gtk_menu_position (menu, TRUE);
+ associate_menu_grab_transfer_window (menu);
+
gtk_menu_scroll_to (menu, priv->scroll_offset);
/* if no item is selected, select the first one */
GdkWindow *window = g_object_get_data (G_OBJECT (menu), "gtk-menu-transfer-window");
if (window)
{
+ GdkWindow *widget_window;
+
gtk_widget_unregister_window (GTK_WIDGET (menu), window);
gdk_window_destroy (window);
g_object_set_data (G_OBJECT (menu), I_("gtk-menu-transfer-window"), NULL);
+
+ widget_window = gtk_widget_get_window (GTK_WIDGET (menu));
+ g_object_set_data (G_OBJECT (widget_window), I_("gdk-attached-grab-window"), window);
}
}